'use strict';



const semver = require('semver');
const colors = require('colors')
const LOWEST_NODE_VERSION = '14.0.0'

class Command {
  constructor(argvs) {
    console.log(argvs, '急急急');
    if (!argvs) {
      throw new Error(colors.red('参数不能是空'))
    }
    if (!Array.isArray(argvs)) {
       throw new Error(colors.red('参数必须是数组'))
    }
    if (argvs.length < 1) {
      throw new Error(colors.red('参数不能是空数组'))
    }
    this._argv = argvs

    let runner = new Promise((resolve, reject) => {
      // 所有的操作都放到微任务里面去
      let chain = Promise.resolve()
      chain = chain.then(() => {
        this.checkNodeVersion()
      })
      chain = chain.then(() => {
        this.initArgvs()
      })

      chain = chain.then(() => {
        this.init()
        this.exec()
      })
      // 抛出错误，catch接住
      // 每一个promise都需要弄一个自己的catch，   这里的promise的错误，其他promise是不能接受的
      chain.catch(e => {
        console.log(e.message, 'eeee');
      })
    })
  }

  initArgvs() {
    this._cmd = this._argv[this._argv.length - 1]
    this.argv = this._argv.slice(0, this._argv.length - 1)
    // console.log(this._cmd, this.argv, '九分裤三大类');
  }

  // 检查当前的node版本
  checkNodeVersion() {
    // 获取当前版本
    console.log(process.version);
    const currentVersion = process.version;
    const lowVersion = LOWEST_NODE_VERSION
    // 比对最低版本，看是否大于最低版本
    if (!semver.gte(currentVersion, lowVersion)) {
      /** 当前版本是否大于等于最低版本 */
      throw new Error(colors.red('版本不得行,版本低了1'))
    }
  }


  init() {
    throw new Error(colors.red('init方法需要实现'))
  }
  exec() {
    throw new Error(colors.red('exec方法需要实现'))
  }
}

module.exports = Command;

